package org.example.server.tcp;

import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.parsetools.RecordParser;
import org.example.protocol.ProtocolConstant;

/**
 * 装饰者模式(使用recordParser对原有的buffer处理能力进行增强)
 */
public class TcpBufferHandlerWrapper implements Handler<Buffer> {

    private final RecordParser recordParser;

    public TcpBufferHandlerWrapper(Handler<Buffer> bufferHandler){
        // 初始化RecordParser对象
        recordParser = initRecordParser(bufferHandler);
    }

    @Override
    public void handle(Buffer buffer) {
        // 调用RecordParser的handle方法
        recordParser.handle(buffer);
    }

    // 初始化RecordParser对象的方法
    private RecordParser initRecordParser(Handler<Buffer> bufferHandler) {
        //构造parser
        RecordParser parser = RecordParser.newFixed(ProtocolConstant.MESSAGE_HEADER_LENGTH);

        // 设置parser的输出
        parser.setOutput(new Handler<Buffer>() {
            //初始化
            int size = -1;
            //一次完整的读取(头+体)
            Buffer resultBuffer = Buffer.buffer();

            // 实现Handler接口的handle方法
            @Override
            public void handle(Buffer buffer) {
                // 如果size为-1，说明还没有读取到消息体长度
                if (-1 == size){
                    //读取消息体长度
                    size = buffer.getInt(13);
                    // 设置parser为固定长度模式
                    parser.fixedSizeMode(size);
                    //写入头信息到结果
                    resultBuffer.appendBuffer(buffer);
                } else {
                    //写入体信息到结果
                    resultBuffer.appendBuffer(buffer);
                    // 已拼接为完整Buffer，执行处理
                    bufferHandler.handle(resultBuffer);
                    //重置一轮
                    parser.fixedSizeMode(ProtocolConstant.MESSAGE_HEADER_LENGTH);
                    size = -1;
                    resultBuffer = Buffer.buffer();
                }
            }
        });
        return parser;
    }
}
